// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
// import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils;
// import com.alibaba.druid.sql.visitor.functions.Function;

// import java.util.ArrayList;
// import java.util.HashMap;
// import java.util.List;
// import java.util.Map;
#pragma once
#include <map>
#include "../../../visitor/SQLEvalVisitor.h"
#include "MySqlASTVisitorAdapter.h"

class MySqlEvalVisitorImpl 
: virtual public MySqlASTVisitorAdapter,
 virtual public SQLEvalVisitor
{
public:
  std::map<std::string, SQLFunction*> functions;
  Object_list_ptr parameters;

  int variantIndex;

  bool markVariantIndex;

  MySqlEvalVisitorImpl();

  MySqlEvalVisitorImpl(Object_list_ptr parameters);

  Object_list_ptr getParameters();

  void setParameters(Object_list_ptr parameters);

  bool visit(SQLCharExpr_ptr x);

  int incrementAndGetVariantIndex();

  int getVariantIndex();

  bool visit(SQLVariantRefExpr_ptr x);

  bool visit(SQLBinaryOpExpr_ptr x);

  bool visit(SQLUnaryExpr_ptr x);

  bool visit(SQLIntegerExpr_ptr x);

  bool visit(SQLNumberExpr_ptr x);

  bool visit(SQLHexExpr_ptr x);

  // @Override
  bool visit(SQLBinaryExpr_ptr x);

  // @Override
  bool visit(SQLCaseExpr_ptr x);

  // @Override
  bool visit(SQLBetweenExpr_ptr x);

  // @Override
  bool visit(SQLInListExpr_ptr x);

  // @Override
  bool visit(SQLNullExpr_ptr x);

  // @Override
  bool visit(SQLMethodInvokeExpr_ptr x);

  // @Override
  bool visit(SQLQueryExpr_ptr x);

  bool isMarkVariantIndex();

  void setMarkVariantIndex(bool markVariantIndex);

  // @Override
  SQLFunction* getFunction(std::string funcName);

  // @Override
  void registerFunction(std::string funcName, SQLFunction* function);

  bool visit(SQLIdentifierExpr_ptr x);

  // @Override
  virtual void unregisterFunction(std::string funcName) override;

  // @Override
  bool visit(SQLBooleanExpr_ptr x);
};
